package com.typing.battle.util;

import android.util.Log;

public class TypingSpeedCalculator {
	private long startTime;
	private long endTime;	
	private String originalStr;
	private String typingStr;
	public TypingSpeedCalculator(){
		
	}
	public TypingSpeedCalculator(String originalStr){
		startTyping(originalStr);
	}
	public void startTyping(String originalStr){
		this.originalStr = originalStr;
		startTime = System.currentTimeMillis();
	}
	public void endTyping(String typingStr){
		this.typingStr = typingStr;
		endTime = System.currentTimeMillis();
	}
	public int[] calculate(){
		int[] result = new int[3]; // index 0 : 걸린시간 (밀리세컨드), 1 : 타수(분당) , 2: 정확도(%)
		
		long workTime = endTime - startTime;
		Log.d("TYPING CAL", endTime + "-" + startTime + "=" +workTime);
		int typingCount = getTypingCount();
		result[0] = (int)workTime;
		result[1] = (typingCount*(60*1000)) / result[0];
		result[2] = getMachPercent();
		return result;
	}
	public int getTypingCount(){	
		int result = 0;
		String tempStr = "";
		if(typingStr.length() < originalStr.length()){
			tempStr = typingStr;
		}else{
			tempStr = originalStr;
		}
		for(int i=0 ; i < tempStr.length(); i++){
			if(tempStr.charAt(i) >= 'ㄱ' && tempStr.charAt(i) <= '힣'){
				int[] temp = parseKorean(tempStr.charAt(i));
				if(temp[0] < 0){
					result += 1;
				}else if(temp[0] > 0 && temp[2] == 0){
					result += 2;
				}else{
					result += 3;
				}
			}else{
				result += 1;
			}
		}
		return result;
	}
	public int getMachPercent(){		
		int count = 0;		
		int typingCount = typingStr.length();
		for(int i=0 ; i < originalStr.length(); i++){
			if(originalStr.length() > typingCount && typingCount == i) break;
			if(originalStr.charAt(i) == typingStr.charAt(i)){
				count++;
			}
		}
		Log.d("TYPING originalStr", originalStr.length()+"");
		int result = ((count*100) / originalStr.length());
		return result;
	}
	public void reset(){
		startTime=0;
		endTime=0;	
		originalStr=null;
		typingStr=null;
	}
	/**
     * 문자를 한글 자음,모음,받침으로 분리하는 메서드
     *
     * @param char word 분리할 문자
     */
    public int[] parseKorean(char word){

        int[] temp=new int[3];

        temp[2] = word - 0xAC00;
        temp[0] = temp[2] / (21 * 28);   //초성 , 자음을 얻는다.
        temp[2] = temp[2] % (21 * 28);
        temp[1] = temp[2] / 28;          //중성 , 모음을 얻는다.
        temp[2] = temp[2] % 28;          //종성 , 받침을 얻는다.

        // temp[0] 이 음수이면 완성된 한글이 아님.(영문이거나 특수문자 숫자 한글 자음,모음등)
        // temp[0] 이 양수이면 완성된 한글임.(가,나,강,공 등)
        // temp[0] 이 양수이고 temp[2] 이 0과 같으면 받침이 없는 한글임.(가,나,강,공 등)
        return temp;
    }
    public void setOriginalStr(String originalStr){
    	this.originalStr = originalStr;
    }
}
